/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package javaapplication1;
import java.util.ArrayList;
import java.util.Date;
/**
 *
 * @author Lawrence
 */
public class Notificacion {
    
    private ArrayList<Estacion> estaciones = new ArrayList<Estacion>();
    private static int indice;
    private int id_viajero;
    private ArrayList<Mensaje> mensajes = new ArrayList<Mensaje>();

    public ArrayList<Mensaje> getMensajes() {
        return mensajes;
    }

    public void setMensajes(ArrayList<Mensaje> mensajes) {
        this.mensajes = mensajes;
    }
    
    
    public ArrayList<Estacion> getEstaciones() {
        return estaciones;
    }

    public void setEstaciones(ArrayList<Estacion> estaciones) {
        this.estaciones = estaciones;
    }

    public int getId_viajero() {
        return id_viajero;
    }

    public void setId_viajero(int id_viajero) {
        this.id_viajero = id_viajero;
    }
    
        

    public Notificacion() 
    {
    }

    public int getIndice() {
        return indice;
    }

    public void setIndice(int indice) {
        Notificacion.indice = indice;
    }
    
    
    public String  revisarCamion(String camion)
    {
         String [] mensaje = camion.split("&");
         String respuesta = "";
         if(mensaje.length > 0)
         {                     
             respuesta = respuesta + procesarMsj(mensaje[0]);             
             if(mensaje.length == 2)
             {
                 respuesta = respuesta + procesarMsj(mensaje[1]);                 
             }
         } 
         return respuesta;
    }
    
    private String procesarMsj(String mensaje)
    {
        String[] miMensaje = mensaje.split("%");
        
        
        if(miMensaje.length > 4)
        {
            this.id_viajero = Integer.parseInt(miMensaje[1]);
            
            if(miMensaje.length == 5)
            {
                mensaje = mensaje +"%"+ String.valueOf(Notificacion.indice);
                miMensaje = mensaje.split("%");
                Notificacion.indice++;                
            }   
            comprobarEstacion(miMensaje,2,mensaje);
            mensaje = mensaje+"&";
        }
        else
        {
            if(miMensaje.length==3)
            {
               mensaje = mensaje +"%"+ String.valueOf(Notificacion.indice);
               miMensaje = mensaje.split("%");
               Notificacion.indice++;
              
            } 
            comprobarEstacion(miMensaje,0,mensaje);
        }
      
        return mensaje;
    }
    
    private void comprobarEstacion(String [] miMensaje,int posicion,String mensaje)
    {   
        Estacion miEstacion;
        if(this.estaciones.isEmpty() || buscarEstacion(this.estaciones)==-1 )
        {            
            miEstacion = new Estacion();
            miEstacion.setId_estacion(this.id_viajero);
            this.estaciones.add(miEstacion);
            clasificarMsj(miEstacion,miMensaje,posicion);            
        }
        else
        {   
            clasificarMsj(this.estaciones.get(buscarEstacion(this.estaciones)),miMensaje,posicion);            
        }        
        
    }
    
    private void clasificarMsj(Estacion miEstacion,String [] miMensaje, int posicion)
    {
        Mensaje mensaje = new Mensaje();
        mensaje.setDestino(Integer.parseInt(miMensaje[posicion]));
        mensaje.setOrigen(Integer.parseInt(miMensaje[posicion+1]));
        mensaje.setMensaje(miMensaje[posicion+2]);
        mensaje.setId_mensaje(miMensaje[miMensaje.length-1]);       
        
        if(this.id_viajero == mensaje.getOrigen())//El mensaje lo esta enviando esta sucursal
        {   
            mensaje.setHrEmision(new Date());
            miEstacion.getEnviados().add(mensaje);
        }
        else if(this.id_viajero == mensaje.getDestino())//El mensaje esta destinado a esta sucursal
        {
            mensaje.setHrRecepcion(new Date());                        
            miEstacion.getRecibidos().add(mensaje);           
        }
        else //El mensaje hace escala en esta sucursal
        {
            miEstacion.getViajeros().add(mensaje);            
        }
        registrarMensaje(mensaje);
    }
    
    private int buscarEstacion(ArrayList<Estacion> estaciones)
    {        
        for(int i=0;i<estaciones.size();i++)
        {
            if(estaciones.get(i).getId_estacion()==this.id_viajero)
            {                
                return i;
            }
        }
        
        return -1;
    }
    
    private void registrarMensaje(Mensaje mensaje)
    {
        if(this.mensajes.isEmpty() || buscarMensaje(this.mensajes,mensaje.getId_mensaje())==-1)
        {
            mensaje.getTrayecto().add(this.id_viajero);
            this.mensajes.add(mensaje);            
        }
        else
        {
            //Trayecto
            this.mensajes.get(buscarMensaje(this.mensajes,mensaje.getId_mensaje())).getTrayecto().add(this.id_viajero);
            //Destino se verifica el destino
            if(mensaje.getHrRecepcion()!=null)
            {
                this.mensajes.get(buscarMensaje(this.mensajes,mensaje.getId_mensaje())).setHrRecepcion(mensaje.getHrRecepcion());
                double tiempoAcumulado = this.mensajes.get(buscarMensaje(this.mensajes,mensaje.getId_mensaje())).getHrRecepcion().getTime()-
                        this.mensajes.get(buscarMensaje(this.mensajes,mensaje.getId_mensaje())).getHrEmision().getTime();
                tiempoAcumulado = tiempoAcumulado/1000;
                this.mensajes.get(buscarMensaje(this.mensajes,mensaje.getId_mensaje())).setTiempoTotal(tiempoAcumulado);
            }
        }
    }
    
    private int buscarMensaje(ArrayList<Mensaje> mensajes,int id_mensaje)
    {        
        for(int i=0;i<mensajes.size();i++)
        {
            if(mensajes.get(i).getId_mensaje()==id_mensaje)
            {                
                return i;
            }
        }
        
        return -1;
    }
    
 
}

